from BaseScene import BaseScene
from typing import Dict, Type, TypeAlias


# 定义类型别名，使代码更清晰
SceneClass: TypeAlias = Type[BaseScene]
SceneRegistry: TypeAlias = Dict[str, SceneClass]


class SceneManager:
    """场景管理器，负责场景切换和窗口管理"""

    def __init__(self, window):
        self.window = window
        self.current_scene = None
        # cx, cy 定义为 SceneManager 内部的量，通过接口函数访问，center_x/y？
        self.cx = (window.width-1920)/2
        self.cy = (window.height-1080)/2
        # 场景注册表
        self.registry: Dict[str, Type[BaseScene]] = {}
    
    def get_cx(self):
        return self.cx
    
    def get_cy(self):
        return self.cy

    def add_scene(self, scene_str: str, scene_class: SceneClass):
        """
        注册场景。
        scene_str: 场景名称，
        scene_class: 场景的类（不是实例）。
        """
        # 对于已有的则直接替换
        self.registry[scene_str] = scene_class

    def switch_scene(self, new_scene_str: str, pointer: int=-1):
        """
        切换场景。
        new_scene_str: 注册场景时设置的名称，
        pointer 默认值 -1，即默认不使用pointer做参数。
        """
        # 移除当前场景的事件处理器
        if self.current_scene:
            self.window.remove_handlers(self.current_scene)
            # 暂停所有音乐
        #防止一开始为none scene
        try:
            for muchal in self.current_scene.muchals.values():
                muchal.pause_music()
        except:
            pass

        try:
            for button in self.current_scene.buttons:
                #多删总没错
                try:
                    self.window.remove_handlers(button)
                except:
                    pass
        except:
            pass

        try:
            for savelabel in self.current_scene.savelabels:
                savelabel.destroy()
        except:
            pass

        # 选择实例化调用方式（场景实例化需要的参数不一样）
        if pointer != -1:
            self.current_scene = self.registry[new_scene_str](self, pointer)
        else:
            self.current_scene = self.registry[new_scene_str](self)

        # 将新场景注册为窗口事件处理器
        self.window.push_handlers(self.current_scene)

        # 注册场景中所有按钮的事件处理器
        for button in self.current_scene.buttons:
            self.window.push_handlers(button)
